/* * Copyright (C) 2014 IUH �yber$oft Team * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package vn.cybersoft.obs.android.fragments; import vn.cybersoft.obs.android.R; import vn.cybersoft.obs.android.activities.SetOptimalModeActivity; import vn.cybersoft.obs.android.application.OBS; import vn.cybersoft.obs.android.dialog.SwitchModeConfirmDialog; import vn.cybersoft.obs.android.listeners.ModeSwitcherListener; import vn.cybersoft.obs.android.provider.OptimalMode; import vn.cybersoft.obs.android.tasks.ModeSwitcherTask; import vn.cybersoft.obs.android.utilities.ToastManager; import vn.cybersoft.obs.android.utilities.Utils; import android.annotation.TargetApi; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.database.Cursor; import android.os.Build; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.LoaderManager.LoaderCallbacks; import android.support.v4.content.Loader; import android.support.v4.widget.ResourceCursorAdapter; import android.view.ContextMenu; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.ContextMenu.ContextMenuInfo; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.AdapterContextMenuInfo; import android.widget.AdapterView.OnItemClickListener; import android.widget.ImageView; import android.widget.ListView; import android.widget.RadioButton; import android.widget.TextView; import android.widget.Toast; public class ModeTabFragment extends Fragment implements OnItemClickListener, LoaderCallbacks<Cursor>, ModeSwitcherListener { public static final String t = "OptimalModeFragment"; public static final int LAYOUT_ID = R.layout.mode_optimization_fragment; private static final int OPTIMAL_MODE_LIST_LOADER = 0x02; private ModeSwitcherTask mModeSwicherTask; private LayoutInflater mInflater; private ListView mModeList; private OptimalModeAdapter mAdapter; private Loader<Cursor> mCursorLoader = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mCursorLoader = getLoaderManager().initLoader(OPTIMAL_MODE_LIST_LOADER, null, this); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mInflater = inflater; final View rootView = mInflater.inflate(LAYOUT_ID, container, false); mModeList = (ListView) rootView.findViewById(R.id.modes_list); mAdapter = new OptimalModeAdapter(getActivity(), R.layout.mode_optimization_list_row); mModeList.setAdapter(mAdapter); mModeList.setVerticalScrollBarEnabled(true); mModeList.setOnCreateContextMenuListener(this); mModeList.setOnItemClickListener(this); View addSchedule = rootView.findViewById(R.id.add_new_mode); addSchedule.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { addNewMode(); } }); // Make the entire view selected when focused. addSchedule.setOnFocusChangeListener(new View.OnFocusChangeListener() { public void onFocusChange(View v, boolean hasFocus) { v.setSelected(hasFocus); } }); return rootView; } @Override public void onResume() { super.onResume(); if (mCursorLoader != null && mCursorLoader.isStarted()) { mCursorLoader.forceLoad(); } } @Override public void onDestroy() { super.onDestroy(); ToastManager.cancelToast(); } private void addNewMode() { startActivity(new Intent(getActivity(), SetOptimalModeActivity.class)); } private void editMode(long id) { Intent intent = new Intent(getActivity(), SetOptimalModeActivity.class); intent.putExtra(OptimalMode.EXTRA_ID, id); startActivity(intent); } private void switchToMode(long id) { if(mModeSwicherTask == null) { mModeSwicherTask = new ModeSwitcherTask(); mModeSwicherTask.setModeSwitcherListener(ModeTabFragment.this); mModeSwicherTask.execute(id); } else { mModeSwicherTask.setModeSwitcherListener(null); ModeSwitcherTask t = mModeSwicherTask; mModeSwicherTask = null; t.cancel(true); } } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Cursor c = (Cursor) parent.getItemAtPosition(position); final OptimalMode optimalMode = new OptimalMode(c); SwitchModeConfirmDialog dialog = new SwitchModeConfirmDialog(getActivity(), optimalMode); dialog.setTitle(((TextView) view.findViewById(R.id.modeName)).getText().toString()); if (optimalMode.id != OBS.getSelectedOptimalModeId()) { dialog.setPositiveButton(R.string.accept, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { switchToMode(optimalMode.id); } }); dialog.setNegativeButton(R.string.cancel, null); } dialog.show(); } @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { // Inflate the menu from xml. getActivity().getMenuInflater().inflate(R.menu.optimal_mode_context_menu, menu); // Use the current item to create a custom view for the header. final AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo; final Cursor c = (Cursor) mModeList.getAdapter().getItem((int) info.position); OptimalMode optimalMode = new OptimalMode(c); menu.setHeaderTitle(optimalMode.name); if (!optimalMode.canEdit) { // the original mode can't modify or delete menu.findItem(R.id.edit_mode).setEnabled(false).setVisible(false); menu.findItem(R.id.delete_mode).setEnabled(false).setVisible(false); } } @Override public boolean onContextItemSelected(MenuItem item) { final AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); final int id = (int) info.id; // Error check just in case. if (id == -1) { return super.onContextItemSelected(item); } switch (item.getItemId()) { case R.id.delete_mode: // Confirm that the schedule will be deleted. new AlertDialog.Builder(getActivity()) .setTitle(getString(R.string.delete_mode)) .setMessage(getString(R.string.delete_mode_confirm)) .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { public void onClick(DialogInterface d, int w) { OptimalMode.deleteMode(getActivity().getContentResolver(), id); } }) .setNegativeButton(android.R.string.cancel, null) .show(); return true; case R.id.switch_mode: switchToMode(id); return true; case R.id.edit_mode: editMode(id); return true; default: break; } return super.onContextItemSelected(item); } @Override public void switchComplete() { mAdapter.notifyDataSetChanged(); mModeSwicherTask.setModeSwitcherListener(null); ModeSwitcherTask t = mModeSwicherTask; mModeSwicherTask = null; t.cancel(true); } @Override public void switchError(String errorMsg) { } @Override public Loader<Cursor> onCreateLoader(int id, Bundle arg1) { return OptimalMode.getModesCursorLoader(getActivity()); } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { mAdapter.swapCursor(cursor); } @Override public void onLoaderReset(Loader<Cursor> loader) { mAdapter.swapCursor(null); } /** * Scroll to mode with given mode id. * * @param modeId The mode id to scroll to. */ @TargetApi(Build.VERSION_CODES.HONEYCOMB) private void scrollToMode(long modeId) { int modePosition = -1; for (int i = 0; i < mAdapter.getCount(); i++) { long id = mAdapter.getItemId(i); if (id == modeId) { modePosition = i; break; } } if (modePosition >= 0) { mModeList.smoothScrollToPositionFromTop(modePosition, 0); } else { // Trying to display a deleted mode should only happen from a missed notification for // an mode that has been marked deleted after use. Context context = getActivity().getApplicationContext(); Toast toast = Toast.makeText(context, R.string.missed_mode_has_been_deleted, Toast.LENGTH_LONG); ToastManager.setToast(toast); toast.show(); } } private class OptimalModeAdapter extends ResourceCursorAdapter { /** * @param context * @param layout * @param c */ public OptimalModeAdapter(Context context, int layout) { super(context, layout, null, 0); } @Override public void bindView(View view, Context context, Cursor c) { final OptimalMode mode = new OptimalMode(c); RadioButton radioButton = (RadioButton) view.findViewById(R.id.selected); if (mode.id == OBS.getSelectedOptimalModeId()) { radioButton.setChecked(true); } else { radioButton.setChecked(false); } TextView modeName = (TextView) view.findViewById(R.id.modeName); modeName.setText(Utils.getString(mContext, mode.name, R.string.class)); TextView modeDesc = (TextView) view.findViewById(R.id.modeDesc); if (mode.desc != null) { modeDesc.setText(Utils.getString(mContext, mode.desc, R.string.class)); } else { modeName.setPadding(0, 15, 0, 15); modeDesc.setVisibility(View.GONE); } ImageView editMode = (ImageView) view.findViewById(R.id.editMode); if (mode.canEdit) { editMode.setVisibility(View.VISIBLE); editMode.setEnabled(true); editMode.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub } }); } else { editMode.setEnabled(false); } } } }